package vue.noteEleve;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ItemListener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

import metier.Eleve;
import metier.Grade;
import metier.Matiere;
import metier.NoteEleve;
import metier.Stage;
import vue.commun.JPanJTable;
import ctr.commun.CommunGest;
import ctr.noteEleve.GestSuppNoteEleve;

public class JPanSuppNoteEleve  extends	JPanel{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1700296640478498039L;
	private JPanJTable panJTable;
	private JPanJTable panJTableNote;
	
	private JTextField jtf_Note;
	private JTextField jtf_Date;
	
	private JPanSuppNoteEleve jPanSuppNoteEleve;
	
	private Stage stage;
	
	private Boolean bl_visible;
	private Boolean bl_visibleModifier;

	
	private JComboBox jcb_Stage;
	private JComboBox jcb_Matiere;
	
	private Eleve eleve ;
	
	private Matiere matiere;
	
	private NoteEleve noteEleve;
	

	
	public JPanSuppNoteEleve(String titre,Stage stage) {
		
		this.stage = stage;
		this.bl_visible=false;
		this.bl_visibleModifier=false;
		this.eleve = null;
		this.matiere = new Matiere(null, null);
		this.noteEleve = new NoteEleve(null, null, null, null);
		
		
		if (stage!=null) {
			init(titre);
		}else {
			JOptionPane.showMessageDialog(this, "Aucun stage saisi, Suppression de note impossible", "Probleme", JOptionPane.WARNING_MESSAGE);
		}
		
		
	}
	
	public  JPanSuppNoteEleve(String titre,JPanSuppNoteEleve jPanSuppNoteEleve) {
		this.stage = jPanSuppNoteEleve.getStage();
		this.matiere = jPanSuppNoteEleve.getMatiere();
		this.eleve=jPanSuppNoteEleve.getEleve();
		this.bl_visible=jPanSuppNoteEleve.getBl_visible();
		this.bl_visibleModifier=jPanSuppNoteEleve.getBl_visibleModifier();
		this.jPanSuppNoteEleve = jPanSuppNoteEleve;
		this.jcb_Stage = jPanSuppNoteEleve.getJcb_Stage();
		this.jcb_Matiere = jPanSuppNoteEleve.getJcb_Matiere();
		this.noteEleve = jPanSuppNoteEleve.getNoteEleve();
		init(titre);
	}
	
	private  void init(String titre){
	
		
		// On test si des stages existe, sinon message erreur.
	
		// On initialise qu'a l'implementation
		if (this.jPanSuppNoteEleve==null) {
			// Recuperation et creation de la comboBox de liste des stages.
			CommunGest communGest = new CommunGest();
			jcb_Stage = new JComboBox(communGest.getListeStage().toArray());
			// je selectionne le premier stage
			this.jcb_Stage.setSelectedItem(stage);
			// en cas de changment de ma comboBox je selectionnne un nouveau stage
			this.jcb_Stage.addItemListener(new GestSuppNoteEleve(this,null));
			
			//j'init ma jcb_Matiere
			jcb_Matiere = new JComboBox(new CommunGest().getListeMatiere().toArray());
			this.jcb_Matiere.setSelectedItem(new CommunGest().getListeMatiere().get(0));
			this.jcb_Matiere.addItemListener(new GestSuppNoteEleve(this, null));
			jcb_Matiere.setName("jcb_Matiere");
			jcb_Stage.setName("jcb_Stage");
		}else{
			ItemListener[] itemListeners = this.jcb_Matiere.getItemListeners();
			for (ItemListener itemListener : itemListeners) {
				this.jcb_Matiere.removeItemListener(itemListener);
			}
			this.jcb_Matiere.addItemListener(new GestSuppNoteEleve(this, null));
		}
		
		// ------------------------------------
		// Insertion du tableau des eleves
		// ------------------------------------
		if (panJTable == null ){
			getTableauEleves();
		}

		
		// Panel global
		// Avec mise en forme.
		this.setBorder(new TitledBorder(titre));
		
		
		
		//**************************************************************************
		//**************************************************************************
		//lbl_EleveSelectionne
		JLabel lbl_EleveSelectionne = new JLabel(libelleSelectionEleve(eleve));
		
		//**************************************************************************
		//**************************************************************************
		
		JLabel lbl_Note = new JLabel("Note");
		JLabel lbl_Matiere = new JLabel("Matiere");
		JLabel lbl_Date = new JLabel("Date");
		
		this.jtf_Note = new JTextField();
		this.jtf_Date = new JTextField();
		
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
		if (noteEleve.getIdEleve()!=null) {
			this.jtf_Note.setText(""+this.noteEleve.getNote());
			this.jtf_Date.setText(""+simpleDateFormat.format(this.noteEleve.getDateNote()));
		}else{
			this.jtf_Note.setText("00.0");
			this.jtf_Date.setText(""+simpleDateFormat.format(new Date()));
		}
		
		//-----------------------------------------------------------------
		//Panel de tableau JVector pour obtenir les notes: panJTableNote
		//-----------------------------------------------------------------
		if (panJTableNote == null ){
			getTableauNote();
		}
		
		JButton jButtonAjoutEleve = new JButton("Retirer");
		jButtonAjoutEleve.addActionListener(new GestSuppNoteEleve(this,null));
		
		//creation du JLabel selection de la note
		JLabel lbl_selectionNote = new JLabel(libelleSelectionEleve(eleve));
		
		//tant que je n'ai pas sélectionné un éleve, mes composants du panel "panelAjoutNote"
		//sont invisibles
		
		lbl_Matiere.setEnabled(this.getBl_visible());
		this.jcb_Matiere.setEnabled(this.getBl_visible());
		lbl_EleveSelectionne.setVisible(this.getBl_visible());
		
		panJTableNote.setVisible(this.getBl_visible());
		
		lbl_Note.setEnabled(this.getBl_visibleModifier());
		this.jtf_Note.setEnabled(false);
		jButtonAjoutEleve.setEnabled(this.getBl_visibleModifier());
		lbl_Date.setEnabled(this.getBl_visibleModifier());
		jtf_Date.setEnabled(false);
		lbl_selectionNote.setEnabled(this.getBl_visibleModifier());
		
		// Panel de label :sélection du stage : 
		JPanel panelLabel = new JPanel(new GridLayout(1,1));
		panelLabel.add(new JLabel("sélection du stage : "));
		
		//Panel de tableau JVector pour obtenir les eleves
		JPanel panelTableau = new JPanel(new GridLayout(1,1));
		panelTableau.add(this.panJTable);
		
		//Panel qui m'affiche le tableau des note de l'eleve par matiere
		JPanel panelModifierNote = new JPanel();
		panelModifierNote.add(this.panJTableNote,BorderLayout.CENTER);
		
		// Panel de saisi
		JPanel panelSaisi = new JPanel(new GridLayout(1,1));
		panelSaisi.add(jcb_Stage);
		
		//panel pour matiere
		JPanel panelMatiere = new JPanel(new GridLayout(1,2));
		//Panel qui m'affiche l eleve selectionne
		JPanel panelLabelEleve = new JPanel(new GridLayout(1,1));
		panelLabelEleve.add(lbl_EleveSelectionne);
		panelMatiere.add(panelLabelEleve);
		
		JPanel panelLabelMatiere = new JPanel();
		panelLabelMatiere.add(lbl_Matiere);
		panelLabelMatiere.add(jcb_Matiere);
		panelMatiere.add(panelLabelMatiere);
		
		//panel pour label note selectionne
		JPanel panelNoteSelectionne = new JPanel(new GridLayout(3,1));
		panelNoteSelectionne.add(lbl_selectionNote);
		
		//panel pour modifier note et date, et bouton valider
		JPanel panelNoteDateBouton = new JPanel();
		panelNoteDateBouton.add(lbl_Note);
		panelNoteDateBouton.add(jtf_Note);
		panelNoteDateBouton.add(lbl_Date);
		panelNoteDateBouton.add(jtf_Date);
		panelNoteDateBouton.add(jButtonAjoutEleve);
		
		//j'ajoute mes composants dans mon panel "panelModifierNote"
		
		this.setLayout(new BorderLayout());
		
		//je personnalise mes panels : panneau Nord
		JPanel panneauNord = new JPanel(new GridLayout(1,2));
		panneauNord.add(panelLabel);
		panneauNord.add(panelSaisi);
		
		//je personnalise mes panels : panneau Centre
		JPanel panneauCentre = new JPanel(new GridLayout(5,1));
		panneauCentre.add(panelTableau);
		//panneauCentre.add(panelLabelEleve);
		panneauCentre.add(panelMatiere);
		panneauCentre.add(panelModifierNote);
	
		
		
		//je personnalise mes panels : panneau sud
		JPanel panneauSud = new JPanel(new GridLayout(1,3));
		panneauSud.add(panelNoteSelectionne,BorderLayout.WEST);
		panneauSud.add(panelNoteDateBouton,BorderLayout.CENTER);
		
		this.add(panneauNord,BorderLayout.NORTH);
		this.add(panneauCentre,BorderLayout.CENTER);
		this.add(panneauSud,BorderLayout.SOUTH);
		
		
	}
	
	private JPanJTable getTableauNote(){

		//nom des colonnes
		Vector<Object> nomColonne= new Vector<Object>(Arrays.asList(new String[] {"Note","Date"}));
		
		//valeurs des lignes
		Vector<Vector<Object>> dataVector= new Vector<Vector<Object>>();
		
		 //Ajout d'un vector Note.
		if (eleve != null && matiere.getIdMatiere()!=null) {
			ArrayList<NoteEleve>lNoteEleve = new CommunGest().getListeNoteEleveByMatiere(eleve, matiere);
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
			for (NoteEleve parNoteEleve : lNoteEleve) {
				dataVector.add(new Vector<Object>(Arrays.asList(new Object[]{
						parNoteEleve.getNote(),simpleDateFormat.format(parNoteEleve.getDateNote())	
				})));
			}
		}
		
		
		panJTableNote = new JPanJTable(null, dataVector, nomColonne, null);
		//ajout d'un gestionnnaire de souris, lorsque je clique sur le nom d'un eleve il apparait 
		//les informations pour ajouter une nouvelle note à celui-ci
		
		panJTableNote.getJtable().addMouseListener(new GestSuppNoteEleve(this,this.panJTableNote));
		panJTableNote.getJtable().setName("tabNotes");
		return panJTableNote;
	
	}
	
	private JPanJTable getTableauEleves(){

		//nom des colonnes
		Vector<Object> nomColonne= new Vector<Object>(Arrays.asList(new String[] {"nom","Prenom", "date de naissance"}));
		
		//valeurs des lignes
		Vector<Vector<Object>> dataVector= new Vector<Vector<Object>>();
		
		 //Ajout d'un vector eleve.
		ArrayList<Eleve>lEleve = new CommunGest().getListeEleve(stage);
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
		for (Eleve eleve : lEleve) {
			dataVector.add(new Vector<Object>(Arrays.asList(new Object[]{
				eleve.getNomEleve(),eleve.getPrenom(),simpleDateFormat.format(eleve.getDateNaissance())	
			})));
		}
		
		panJTable = new JPanJTable(null, dataVector, nomColonne, null);
		panJTable.getJtable().setName("tabEleve");
		//ajout d'un gestionnnaire de souris, lorsque je clique sur le nom d'un eleve il apparait 
		//les informations pour ajouter une nouvelle note à celui-ci
		panJTable.getJtable().addMouseListener(new GestSuppNoteEleve(this,this.panJTable));
		return panJTable;
	}
	
	private String libelleSelectionEleve(Eleve eleve) {
		String abrevationGrade="";
		
		if (eleve!=null) {
			Grade grade = new CommunGest().getGrade(this.eleve.getIdGrade());
			 abrevationGrade = grade.getAbrev();
		}
		String nom = "", prenom = "";
		if ( this.eleve !=null ){
			nom = this.eleve.getNomEleve();
		}
		if ( this.eleve !=null ){
			prenom = this.eleve.getPrenom();
		}
		//lbl_EleveSelectionne
		return "Vous avez selectionné : "+abrevationGrade+" "
		+ nom +" "+prenom;
	}

	public JComboBox getJcb_Stage() {
		return jcb_Stage;
	}

	public JPanJTable getPanJTable() {
		return panJTable;
	}

	public JPanSuppNoteEleve getJPanSuppNoteEleve() {
		return jPanSuppNoteEleve;
	}

	public Stage getStage() {
		return stage;
	}
	public void setStage(Stage stage) {
		this.stage = stage;
	}



	public JTextField getJtf_Note() {
		return jtf_Note;
	}

	public JComboBox getJcb_Matiere() {
		return jcb_Matiere;
	}
	

	public void setJcf_Matiere(JComboBox jcf_Matiere) {
		this.jcb_Matiere = jcf_Matiere;
	}

	public Boolean getBl_visible() {
		return bl_visible;
	}

	public void setBl_visible(Boolean bl_visible) {
		this.bl_visible = bl_visible;
	}

	public Eleve getEleve() {
		return eleve;
	}

	public void setEleve(Eleve eleve) {
		this.eleve = eleve;
	}

	public JTextField getJtf_Date() {
		return jtf_Date;
	}

	public Matiere getMatiere() {
		return matiere;
	}

	public void setMatiere(Matiere matiere) {
		this.matiere = matiere;
	}

	public NoteEleve getNoteEleve() {
		return noteEleve;
	}

	public void setNoteEleve(NoteEleve noteEleve) {
		this.noteEleve = noteEleve;
	}

	public Boolean getBl_visibleModifier() {
		return bl_visibleModifier;
	}

	public void setBl_visibleModifier(Boolean bl_visibleModifier) {
		this.bl_visibleModifier = bl_visibleModifier;
	}
	
	
	
	


}
